package logica;

import java.util.List;

public class Adivinador {

	public static enum opcion {
		SI, NO, NOSE, TALVEZ, TALVEZNO
	}

	private ArbolDeAtributos m_arbol;
	private boolean m_acierto;

	public Adivinador(ArbolDeAtributos datos) {
		m_arbol = (ArbolDeAtributos) datos;
	}

	public String pregunta() {

		if (creeSaber()) {
			return preguntaSiAdivino();
		} else
			return preguntaAtributo();
	}

	/** Mensajues de preguntas: */
	public String preguntaAtributo() {
		String atributo = m_arbol.getElemento().getAtributo();
		return "¿Lo que estas pensando " + atributo + "?";
	}

	public String preguntaSiAdivino() {
		String nombre = m_arbol.getElemento().getNombre();
		return "¿Es un " + nombre + "?";
	}

	public void vuelveAEmpezar() {
		m_arbol.volverALaRaiz();
	}

	public void vuelveAtras() {
		m_arbol.volverARamaAnterior();
	}
	/******/

	/** Recibe la respuesta a la pregunta. */
	public boolean recibeRespuesta(Adivinador.opcion op) {

		switch (op) {
		case SI:
			if (creeSaber())
				return m_acierto = true;
			else
				return m_arbol.treparRamaPositiva();

		case NO:
			if (creeSaber())
				return m_acierto = false;
			else
				return m_arbol.treparRamaNegativa();

			// case NOSE:
			// case TALVEZ:
			// case TALVEZNO:

		default:
			break;
		}

		return false;
	}

	/** Control de estado: */
	public boolean creeSaber() {
		return m_arbol.ultimaRama();
	}

	public boolean loAcerto() {
		return m_acierto;
	}

	public String piensaQueSeLlama() {
		return m_arbol.getElemento().getNombre();
	}

	public String piensaQueSeVeComo() {
		return m_arbol.getElemento().getImagen();
	}
	/*******/
	
	/** Entrenamiento: */
	public boolean aprendeUn(String nombre, List<String> atributos) {
		return m_arbol.agregarEnActual(new Elemento(nombre, atributos));
	}

	public ArbolDeAtributos getArbol() {
		return m_arbol;
	}

	@Override
	public String toString() {
		return "[ad:" + m_arbol.toString() + "]";
	}

}
